home *** CD-ROM | disk | FTP | other *** search
/ MACD 5 / MACD 5.bin / workbench / boot / czesc_2 / onekeyii / src / display.c next >
C/C++ Source or Header  |  1992-11-23  |  7KB  |  292 lines

  1. /*
  2. *    display.c
  3. *
  4. *    NewWindow and WinTexts for OneKeyII.
  5. *
  6. *    Layout is:
  7. *
  8. *    01234567890123456789
  9. *    Ctrl Qualifiers
  10. *    Shift     Shift
  11. *     Alt A   A Alt
  12. *
  13. *    MWS, 11/92.
  14. */
  15.  
  16. #include <exec/types.h>
  17. #include <intuition/intuition.h>
  18. #include "wintext.h"
  19. #include "menu.h"
  20.  
  21. #define ABOUT_TXT "\
  22.    OneKeyII Version 1.0\n\
  23.     by Martin W. Scott\n\
  24. \n\
  25. email: mws@castle.ed.ac.uk\n\
  26.        (until June 1993)\n\
  27. \n\
  28.       Public Domain.\
  29. "
  30.  
  31. void DrawState(UWORD);
  32. void InitWindowPos(void);
  33. BOOL ShowWindow(void);
  34. void HideWindow(void);
  35. BOOL HandleIDCMP(void);        /* returns FALSE if window to close */
  36.  
  37. /* character dimensions */
  38. #define CHARS_ACROSS    15
  39. #define CHARS_DOWN    3
  40.  
  41. /* initial position */
  42. #define LEFTEDGE 40
  43. #define TOPEDGE 20
  44.  
  45. #define WIN_TITLE NULL /*"OneKeyII"*/
  46.  
  47. struct Gadget drag_gadget = {
  48.     /* whole window */
  49.     NULL,
  50.     0, 0, 0, 0,                /* not the right/bottom edges */
  51.     GRELWIDTH | GRELHEIGHT | GADGHNONE,    /* no highlighting...*/
  52.     GADGIMMEDIATE,
  53.     GTYP_WDRAGGING
  54.     /* rest is 0/NULL */
  55. };
  56.  
  57. struct NewWindow nw =
  58. {
  59.     LEFTEDGE, TOPEDGE, 0, 0, -1, -1,    /* dimension, pens */
  60.     CLOSEWINDOW | MENUPICK,    /* IDCMP flags */    
  61.     WFLG_SMART_REFRESH,        /* window flags */
  62.     &drag_gadget, NULL,        /* gadgets, checkmark */
  63.     WIN_TITLE,            /* title */
  64.     NULL, NULL,            /* screen, bitmap */
  65.     0, 0, 0, 0,            /* extrema of dimensions */
  66.     WBENCHSCREEN        /* screen to open onto */
  67. };
  68.  
  69. struct TagItem wtags[] =
  70. {
  71.     {TAG_DONE}
  72. };
  73.  
  74. struct Window *window;
  75. struct Menu *menu;
  76. static WINTEXTINFO wtinfo;    /* to be initialised later */
  77. ULONG winsigflag;
  78. UWORD oldqual = -1;
  79.  
  80. /*********************** SHOW QUALIFIER SITUATION *****************************/
  81. #define STD    1        /* normal state */
  82. #define HIGH    2        /* active state */
  83. #define TXT    3
  84.  
  85. #define QUALS()        WinText(&wtinfo, "Qualifiers", 5, 0, TXT, 0)
  86. #define LSHIFT(qual)    WinText(&wtinfo, "Shift", 0, 1, (qual & IEQUALIFIER_LSHIFT) ? HIGH : STD, 0)
  87. #define RSHIFT(qual)    WinText(&wtinfo, "Shift", 10, 1, (qual & IEQUALIFIER_RSHIFT) ? HIGH : STD, 0)
  88. #define LALT(qual)    WinText(&wtinfo, "Alt", 1, 2, (qual & IEQUALIFIER_LALT) ? HIGH : STD, 0)
  89. #define RALT(qual)    WinText(&wtinfo, "Alt", 11, 2, (qual & IEQUALIFIER_RALT) ? HIGH : STD, 0)
  90. #define LAMIGA(qual)    WinText(&wtinfo, "A", 5, 2, (qual & IEQUALIFIER_LCOMMAND) ? HIGH : STD, 0)
  91. #define RAMIGA(qual)    WinText(&wtinfo, "A", 9, 2, (qual & IEQUALIFIER_RCOMMAND) ? HIGH : STD, 0)
  92. #define CTRL(qual)    WinText(&wtinfo, "Ctrl", 0, 0, (qual & IEQUALIFIER_CONTROL) ? HIGH : STD, 0)
  93.  
  94. void
  95. DrawState(UWORD qual)
  96. {
  97.     if (oldqual != qual)
  98.     {
  99.     QUALS();
  100.     LSHIFT(qual);
  101.     RSHIFT(qual);
  102.     LALT(qual);
  103.     RALT(qual);
  104.     LAMIGA(qual);
  105.     RAMIGA(qual);
  106.     CTRL(qual);
  107.     oldqual = qual;
  108.     }
  109. }
  110.  
  111. /********************* DISPLAY OPEN/CLOSE ROUTINES ****************************/
  112.  
  113. /***** GRATEFULLY LIFTED FROM UHR.C BY STEFAN STICHT *****/
  114. /*
  115.  *  request(): a glue routine to EasyRequest as simple as printf plus
  116.  *             titlestring, gadgettexts
  117.  *
  118.  *  Input: char *title:         pointer to the title of the requester
  119.  *         char *gadgets:       pointer to gadgettext
  120.  *         char *text:          text displayed in requester
  121.  *
  122.  *  Result: same as EasyrequestArgs()
  123.  *
  124.  * !!! for more info see EasyRequestArgs() in Autodocs/intuition.doc !!!
  125.  */
  126. #include <stdarg.h>
  127. #include <dos/dosextens.h>
  128. long request(char *title, char *gadgets, char *text, ...)
  129. {
  130.     /*
  131.      *  structure textreq only needed in this function, so hide it here
  132.      *  must be static, in order to be initialized only once
  133.      */
  134.     long rc = 0;
  135.     struct EasyStruct textreq = {
  136.         sizeof (struct EasyStruct), /* ULONG es_StructSize      */
  137.         0l,                         /* ULONG es_Flags           */
  138.         NULL,                       /* UBYTE *es_Title          */
  139.         NULL,                       /* UBYTE *es_TextFormat     */
  140.         NULL,                       /* UBYTE *es_GadgetFormat   */
  141.         };
  142.     struct Process *process;
  143.     struct Window *win;
  144.     va_list ap;
  145.  
  146.     /*
  147.      *  get start of variable arguments
  148.      */
  149.     va_start(ap, text);
  150.  
  151.     if (process = (struct Process *)FindTask(NULL)) {
  152.         if ((long)(win = process->pr_WindowPtr) != -1) {
  153.  
  154.             /*
  155.              *  update textreq
  156.              */
  157.             textreq.es_Title = (UBYTE *)title;
  158.             textreq.es_TextFormat = (UBYTE *)text;
  159.             textreq.es_GadgetFormat = (UBYTE *)gadgets;
  160.  
  161.             rc = EasyRequestArgs(win, &textreq, NULL, ap);
  162.  
  163.             }
  164.  
  165.         }
  166.  
  167.     va_end(ap);
  168.  
  169.     return(rc);
  170. }
  171.  
  172. void
  173. InitWindowPos()
  174. {
  175.     nw.LeftEdge = TTInt("LEFTEDGE", LEFTEDGE);
  176.     nw.TopEdge = TTInt("TOPEDGE", TOPEDGE);
  177. }
  178.  
  179. BOOL
  180. ShowWindow()            /* alloc wintext memory, open window */
  181. {
  182.     extern UWORD quals;
  183.     extern BOOL toggle;
  184.  
  185.     if (window)            /* already open */
  186.     return TRUE;
  187.  
  188.     if (InitWinTextInfo(&wtinfo))
  189.     {
  190.     /* size window to fit screen font */
  191.     nw.Height = CHARS_DOWN * wtinfo.font_y + wtinfo.toffset + wtinfo.boffset;
  192.     nw.Width = CHARS_ACROSS * wtinfo.font_x + wtinfo.loffset + wtinfo.roffset;
  193.  
  194.     if (window = OpenWindowTagList(&nw, wtags))
  195.     {
  196.         if (menu = AllocOneKeyMenu(window))
  197.         {
  198.         struct MenuItem *item;
  199.  
  200.         item = ItemAddress(menu, FULLMENUNUM(ONEKEYII, TOGGLE, 0));
  201.         if (toggle)
  202.             item->Flags |= CHECKED;                  
  203.         else
  204.             item->Flags &= ~CHECKED;                                  
  205.  
  206.         SetMenuStrip(window, menu);
  207.         wtinfo.window = window;
  208.         winsigflag = 1 << window->UserPort->mp_SigBit;
  209.         DrawState(quals);
  210.         return TRUE;
  211.         }
  212.         else
  213.         {
  214.         CloseWindow(window);
  215.         window = NULL;
  216.         }
  217.     }
  218.     }
  219.     return FALSE;
  220. }
  221.  
  222. void
  223. HideWindow()            /* close window */
  224. {
  225.     if (window)
  226.     {
  227.     nw.LeftEdge = window->LeftEdge;
  228.     nw.TopEdge = window->TopEdge;
  229.     CloseWindow(window);
  230.     FreeOneKeyMenu();
  231.     window = NULL;
  232.     winsigflag = 0;
  233.     oldqual = -1;
  234.     }
  235. }
  236.  
  237. /* return FALSE if user quits (not possible at moment) */
  238. BOOL
  239. HandleIDCMP()
  240. {
  241.     struct IntuiMessage *msg;
  242.     struct MenuItem *item;
  243.     /*        struct Gadget   *gadget;                        */
  244.     ULONG class;
  245.     UWORD code;
  246.     extern BOOL toggle;
  247.  
  248.     if (!window)
  249.     return FALSE;
  250.  
  251.     while (msg = (struct IntuiMessage *) GetMsg(window->UserPort))
  252.     {
  253.     class = msg->Class;
  254.     code = msg->Code;
  255.     /*                gadget = (struct Gadget *)msg->IAddress;*/
  256.     ReplyMsg(msg);
  257.  
  258.     switch (class)
  259.     {
  260.     case CLOSEWINDOW:
  261.         HideWindow();
  262.         return TRUE;
  263.     case MENUPICK:
  264.         while (code != MENUNULL)
  265.         {
  266.         UWORD inum = ITEMNUM(code);
  267.  
  268.         if (MENUNUM(code) == ONEKEYII)
  269.         {
  270.             switch (inum)
  271.             {
  272.             case TOGGLE:
  273.             toggle ^= 1;
  274.             break;
  275.             case ABOUT:
  276.             request("OneKeyII", "OK", ABOUT_TXT);
  277.             break;
  278.             case HIDE:
  279.             HideWindow();
  280.             return TRUE;
  281.             case QUIT:
  282.             return FALSE;
  283.             }
  284.         }
  285.         item = ItemAddress(menu, code);
  286.         code = item->NextSelect;
  287.         }
  288.     }
  289.     }
  290.     return TRUE;
  291. }
  292.